# 在程序中，继承描述的是多个类之间的所属关系
# 如果一个A类里面的属性和方法可以复用，则可以通过继承的方式，传递到B类里
# 那么类A就是基类，也叫父类；B类就是派生类，也叫子类
# 继承的存在减少了大量的重复代码的编写，大大提高了代码的复用率
# 继承的格式 class 子类名(父类名):
# object类是所有类的父类，在继承时，子类拥有父类的所有内容
# 子类无法使用父类的私有属性和私有方法

# 定义一个父类
class Phone(object):
    def __init__(self, number, info):
        self.number = number
        # 父类中的私有属性
        self.__info = info

    def call(self):
        print('号码 ' + self.number + ' 在打电话')

    # 父类中的私有方法
    def _showInfo(self):
        print(self.__info)


# 定义一个子类
class AndroidPhone(Phone):

    def carmera(self):
        print('正在拍照')


myPhone = AndroidPhone('13215546701', '父类信息')
myPhone.call()
myPhone.carmera()


# 方法的重写与重载
# 1.重写是指父类和子类有相同名称的方法名，此时子类对象调用的是自己的方法名 overiding method
# 2.重载是指函数的方法名相同，但是参数不同 overloading method
class Father(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self):
        print('father eat')

    def sleep(self):
        print('father sleep')


class Son(Father):
    # 子类提供了init方法后，那么在使用子类实例对象时，就会调用子类自己的init方法
    # 并不会调用父类的init方法，如果想要调用父类的init方法 需要使用父类名.init()并将self和参数传递进去
    def __init__(self, sex, name, age):
        Father.__init__(self, name, age)
        self.sex = sex

    def eat(self):
        print('son eat')

    def sleep(self, time):
        Father.sleep(self)
        print('son sleep', time, '小时')


son = Son('男', '张三', 22)
son.eat()
son.sleep(8)
print(son.sex)
print(son.name)
